package br.com.sisat.persistencia.DAO;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.ArrayList;
import java.util.List;

import br.com.sisat.modelo.RelatorioPacientesAgendadosDTO;
import br.com.sisat.persistencia.conexao.ConnectionProvider;
import br.com.sisat.util.ObjectUtil;
import br.com.sisat.util.UtilDatas;

public class RelatorioPacientesAgendadosDAO {

	private static RelatorioPacientesAgendadosDAO dao;
	
	public static RelatorioPacientesAgendadosDAO getInstance(){
		if(ObjectUtil.isEmpty(dao)){
			dao = new RelatorioPacientesAgendadosDAO();
		}
		return dao;
	}

	public List<RelatorioPacientesAgendadosDTO> recuperarAgendados() throws Exception {
		List<RelatorioPacientesAgendadosDTO> lista = new ArrayList<RelatorioPacientesAgendadosDTO>();
		String sql = "select (SELECT count (date_part('dow', data)) as qtd01 from sat.consulta where date_part('dow', data) = 1 and  consulta.data > current_date) as domingo," +
				     "(SELECT count (date_part('dow', data)) as qtd02 from sat.consulta where date_part('dow', data) = 2 and  consulta.data > current_date and  consulta.fim is null) as segunda, " +
				     "(SELECT count (date_part('dow', data)) as qtd03 from sat.consulta where date_part('dow', data) = 3 and  consulta.data > current_date and  consulta.fim is null) as terca, " +
				     "(SELECT count (date_part('dow', data)) as qtd04 from sat.consulta where date_part('dow', data) = 4 and  consulta.data > current_date and  consulta.fim is null) as quarta, " +
				     "(SELECT count (date_part('dow', data)) as qtd05 from sat.consulta where date_part('dow', data) = 5 and  consulta.data > current_date and  consulta.fim is null) as quinta, " +
				     "(SELECT count (date_part('dow', data)) as qtd06 from sat.consulta where date_part('dow', data) = 6 and  consulta.data > current_date and  consulta.fim is null) as sexta, " +
				     "(SELECT count (date_part('dow', data)) as qtd07 from sat.consulta where date_part('dow', data) = 7 and  consulta.data > current_date and  consulta.fim is null) as sabado " +
				     "from sat.consulta consulta " +
				     "group by domingo, segunda, terca, quarta, quinta, sexta, sabado ";
		Connection conn = ConnectionProvider.getDefaultConnection();
		PreparedStatement ps = conn.prepareStatement(sql);
		ResultSet rs = ps.executeQuery();
		while(rs.next()){
			RelatorioPacientesAgendadosDTO item = new RelatorioPacientesAgendadosDTO();
			item.setQtd1(rs.getLong("domingo"));
			item.setQtd2(rs.getLong("segunda"));
			item.setQtd3(rs.getLong("terca"));
			item.setQtd4(rs.getLong("quarta"));
			item.setQtd5(rs.getLong("quinta"));
			item.setQtd6(rs.getLong("sexta"));
			item.setQtd7(rs.getLong("sabado"));
			lista.add(item);
		}
		conn.close();
		return lista;
	}

	public List<RelatorioPacientesAgendadosDTO> recuperarEspera() throws Exception {
		List<RelatorioPacientesAgendadosDTO> lista = new ArrayList<RelatorioPacientesAgendadosDTO>();
		String sql = "SELECT pessoa.nome as paciente , especialidade.nome as especialidade, (SELECT pessoa.nome " +
				     "FROM sat.terapeuta terapeuta " +
				     "join sat.pessoa pessoa on (terapeuta.id_pessoa = pessoa.id_pessoa) " +
				     "join sat.especialidade especialidade on (terapeuta.id_especialidade = especialidade.id_especialidade) " +
				     "join sat.consulta consultaIn on (terapeuta.id_terapeuta = consultaIn.id_terapeuta) " +
				     "where  consultaIn.id_consulta = consulta.id_consulta) as terapeuta, consulta.inicio " +
				     "FROM sat.consulta consulta " +
				     "join sat.pessoa pessoa on (consulta.id_pessoa = pessoa.id_pessoa) " +
				     "join sat.terapeuta terapeuta on (consulta.id_terapeuta = terapeuta.id_terapeuta) " +
				     "join sat.especialidade especialidade on (terapeuta.id_especialidade = especialidade.id_especialidade) " +
				     "where consulta.data > current_date";
		Connection conn = ConnectionProvider.getDefaultConnection();
		PreparedStatement ps = conn.prepareStatement(sql);
		ResultSet rs = ps.executeQuery();
		while(rs.next()){
			RelatorioPacientesAgendadosDTO item = new RelatorioPacientesAgendadosDTO();
			item.setNoPaciente(rs.getString("paciente"));
			item.setNoEspecialidade(rs.getString("especialidade"));
			item.setNoTerapeuta(rs.getString("terapeuta"));
			item.setHorario(rs.getString("inicio"));
			lista.add(item);
		}
		conn.close();
		return lista;
	}

	public List<RelatorioPacientesAgendadosDTO> consultar(String data) throws Exception{
		List<RelatorioPacientesAgendadosDTO> lista = new ArrayList<RelatorioPacientesAgendadosDTO>();
		String sql = "SELECT cons.nu_status, paciente.nome no_pessoa, terapeuta.nome no_terapeuta, espec.nome no_especialidade, cons.inicio "+
						"	FROM sat.consulta cons "+
						"	JOIN sat.pessoa paciente on (cons.id_pessoa = paciente.id_pessoa) "+
						"	JOIN sat.terapeuta teraEspec on (cons.id_terapeuta = teraEspec.id_terapeuta) "+
						"	JOIN sat.pessoa terapeuta on (teraEspec.id_pessoa = terapeuta.id_pessoa) "+
						"	JOIN sat.especialidade espec on (espec.id_especialidade = teraEspec.id_especialidade) "+
						"	WHERE cons.data = '"+UtilDatas.strToSQLDate(data)+"'";
	Connection conn = ConnectionProvider.getDefaultConnection();
	PreparedStatement ps = conn.prepareStatement(sql);
	ResultSet rs = ps.executeQuery();
	while(rs.next()){
		RelatorioPacientesAgendadosDTO item = new RelatorioPacientesAgendadosDTO();
		item.setNoPaciente(rs.getString("no_pessoa"));
		item.setNoEspecialidade(rs.getString("no_especialidade"));
		item.setNoTerapeuta(rs.getString("no_terapeuta"));
		item.setHorario(rs.getString("inicio"));
		item.setStatus(rs.getString("nu_status"));
		lista.add(item);
	}
	conn.close();
		return lista;
	}
	
}
